package org.aspire.core.loop;

import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;

/******************************************************************************
 * A loop controller implementation derived from jRabbit LoopController class
 * which utilize LWJGL Sys.getTime() to retrieve current system time.
 * 
 * @author JPACarabuena
 *****************************************************************************/
public class PreciseLoopController extends LoopController {

	// ========================================================================
	// Constants
	// ========================================================================

	// ========================================================================
	// Static Methods
	// ========================================================================

	// ========================================================================
	// Fields
	// ========================================================================

	// ========================================================================
	// Constructors
	// ========================================================================

	/**************************************************************************
	 * Construct a new precise loop controller.
	 *************************************************************************/
	public PreciseLoopController() {
		super();
		this.lastCall = Sys.getTime();
	}
	
	// ========================================================================
	// Getters & Setters
	// ========================================================================

	// ========================================================================
	// Override Methods
	// ========================================================================

	@Override
	public void sleep() {
		if(this.regulate) {
			Display.sync(this.fps);
		}
	}
	
	@Override
	public void tick() {
		this.duration = (((Sys.getTime() - this.lastCall) * this.resolution)
				/ Sys.getTimerResolution());
		this.lastCall = Sys.getTime();
		
		this.fpsCounter.calculateFPS();
	}

	// ========================================================================
	// Methods
	// ========================================================================

	// ========================================================================
	// Inner & Anonymous Classes
	// ========================================================================
}